package com.algorithm.learning.base.动态规划;

/**
 * @program: algorithm-learning
 * @description:
 * @author: YuKai Fan
 * @create: 2024/9/3 21:17
 **/
public class 从左往右模型1 {

    public static int dpWays1(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
        return process(str.toCharArray(), 0);
    }

    public static int process(char[] str, int i) {
        // i已经到了终止位置, 说明可以转化，直接返回1
        if (i == str.length) {
            return 1;
        }
        // 这里的意思是
        // 1->A, 11->K, 26 -> Z，所以0是没有转化的，直接返回0即可
        if (str[i] == '0') {
            return 0;
        }
        if (str[i] == '1') {
            int res = process(str, i + 1); // i自己作为单独的部分，后续有多少种方法
            if (i + 1 < str.length) {
                res += process(str, i + 2); // i和i+1作为单独的部分，后续有多少种方法
            }
            return res;
        }
        if (str[i] == '2') {
            int res = process(str, i + 1);
            // 当i为2时，下一个数只能是0-6，因为20-26都可转为字母，但是27没有
            if (i + 1 < str.length && (str[i + 1] >= '0' && str[i + 1] <= '6')) {
                res += process(str, i + 2);
            }
            return res;
        }
        // str[i] = '3' ~ '9'
        return process(str, i + 1);
    }
}
